package cn.good.yan.basics.t2.config.druid;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.Filter;
import javax.servlet.Servlet;
import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.HashMap;

/**
 * Druid配置类
 *      访问页面：xxx/druid/login.html
 *      如：引这个包，需要配置当前文件的配置类，并不需要yml中配置  druid：下面的配置
 *        <dependency>
 *            <groupId>com.alibaba</groupId>
 *            <artifactId>druid</artifactId>
 *            <version>1.1.23</version>
 *        </dependency>
 *      如：引用这个包，并不需要当前文件作为配置类，默认自带的  需要在yml中配置  配置 druid：下面的配置
 *        <dependency>
 *             <groupId>com.alibaba</groupId>
 *             <artifactId>druid-spring-boot-starter</artifactId>
 *             <version>1.1.17</version>
 *         </dependency>
 *
 * # 一些默认 yml中配置 ,这是是 在有该配置类，进行配置
 * # 引入Druid数据源
 * #    type: com.alibaba.druid.pool.DruidDataSource
 * #    # druid 数据源专有配置  默认无法绑定,在DruidConfig - druidDataSource 的Bean进行注入绑定 【只要有set方法都可以通过配置类配置】
 * #    initialSize: 8
 * #    minIdle: 5
 * #    maxActive: 20
 * #    maxWait: 60000
 * #    timeBetweenEvictionRunsMillis: 60000
 * #    minEvictableIdleTimeMillis: 300000
 * #    validationQuery: SELECT 1 FROM DUAL
 * #    testWhileIdle: true
 * #    testOnBorrow: false
 * #    testOnReturn: false
 * #    poolPreparedStatements: true
 *     #   配置监控统计拦截的filters，去掉后监控界面sql无法统计，'wall'用于防火墙
 * #    filters: stat,wall,logback
 * #    maxPoolPreparedStatementPerConnectionSize: 25
 * #    useGlobalDataSourceStat: true
 * #    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
 *
 * @author shengren.yan
 * @create 2022-12-04
// */
//@Configuration
//public class DruidConfig {
//
//    // 将所有前缀为spring.datasource下的配置项都加载DataSource中  [这样目的，一般去yml配置文件里获取]
//    @ConfigurationProperties(prefix = "spring.datasource")
//    @Bean
//    public DataSource druidDataSource() throws SQLException {
//        // Druid的数据源
//        DruidDataSource druidDataSource = new DruidDataSource();
//        // 加入监控功能 stat  防火墙 wall  （多值用 , 分割）
//        druidDataSource.setFilters("stat,wall");
//        return druidDataSource;
//    }
//
//
//    /**
//     * 配置 Druid 后台监控页面
//     *     访问页面：xxx/druid/login.html
//     * @return {@link ServletRegistrationBean}<{@link Servlet}>
//     */
//    @Bean
//    public ServletRegistrationBean<Servlet> druidServlet() {
//        // 进行 druid 监控的配置处理
//        ServletRegistrationBean<Servlet> srb = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
//        // 设置初始化参数值
//        HashMap<String, String> map = new HashMap<>();
//        map.put(StatViewServlet.PARAM_NAME_USERNAME, "root");      // 用户名
//        map.put(StatViewServlet.PARAM_NAME_PASSWORD, "123");       // 密码
//        // 如果不写，则默认所有ip都可以访问
//        map.put(StatViewServlet.PARAM_NAME_ALLOW, "");             // 白名单  ip
//        map.put(StatViewServlet.PARAM_NAME_DENY, "192.168.10.1");  // 黑名单  禁止的ip
//        srb.setInitParameters(map);
//        return srb;
//
//        // 下面跟上面一样，只是使用了 StatViewServlet.PARAM_NAME_USERNAME常量
//        // 白名单 允许谁都可以访问 ，第二个参数，一般指具体的 人
//        // srb.addInitParameter("allow", "");
//        // 黑名单 禁止别人访问
//        // srb.addInitParameter("deny", "192.168.31.253");
//        // 用户名
//        // srb.addInitParameter("loginUsername", "root");
//        // 密码
//        // srb.addInitParameter("loginPassword", "root");
//        // 是否可以重置数据源
//        // srb.addInitParameter("resetEnable", "false");
//        // return srb;
//
//    }
//
//
//    /**
//     * Druid 监听接口，有些接口需要过滤掉
//     * filter 过滤  - 用于监听web - jdbc管理监控数据  【URL监控、Web应用】
//     * @return {@link FilterRegistrationBean}<{@link Filter}>
//     */
//    @Bean
//    public FilterRegistrationBean<Filter> filterRegistrationBean() {
//        FilterRegistrationBean<Filter> frb = new FilterRegistrationBean<>();
//        frb.setFilter(new WebStatFilter());
//        // 所有请求进行监控处理 （监控哪些请求）
//        frb.addUrlPatterns("/*");
//        // 排除名单
//        frb.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.css,/druid/*");
//        return frb;
//    }
//
//}
